package com.example.controller;

import com.example.Service.ImageService;
import com.example.entity.RestBean;
import io.minio.errors.ErrorResponseException;
import jakarta.annotation.Resource;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;


/**
 * 作者:xuSen
 * 日期2025/4/25 13:20
 */
@Slf4j
@RestController
public class ObjectController {
    // 注入ImageService资源，用于处理与图像相关的操作
    @Resource
    private ImageService imageService;

    /**
     * 处理获取头像图像的请求
     * 此方法接收GET请求，尝试从Minio存储中提取图像，并将其直接返回给客户端
     * 如果图像路径不符合预期或图像不存在，将向客户端返回404错误
     *
     * @param request  HTTP请求对象，包含请求路径等信息
     * @param response HTTP响应对象，用于向客户端发送图像数据或错误信息
     * @throws Exception 如果图像处理过程中发生错误，将抛出此异常
     */
    @GetMapping("/images/avatar/**")
    public void imageFetch(HttpServletRequest request, HttpServletResponse response ) throws Exception {
        this.fetchImage(request,response);
    }

    /**
     * 从Minio存储中提取图像并返回给客户端
     * 此方法首先解析请求路径以获取图像路径，然后根据该路径尝试从Minio存储中提取图像
     * 如果图像路径过短或图像不存在，将向客户端返回404错误，否则将图像数据写入响应流
     *
     * @param request  HTTP请求对象，用于获取图像路径信息
     * @param response HTTP响应对象，用于向客户端发送图像数据或错误信息
     * @throws Exception 如果图像处理过程中发生错误，将抛出此异常
     */
    private void fetchImage(HttpServletRequest request, HttpServletResponse response ) throws Exception {
        // 从请求路径中提取图像路径
        String imagePath = request.getServletPath().substring(7);
        // 获取响应输出流，用于向客户端发送图像数据或错误信息
        ServletOutputStream stream = response.getOutputStream();
        // 检查图像路径长度，如果过短则认为是无效请求，返回404错误
        if(imagePath.length()<=13){
            response.setStatus(404);
            stream.println(RestBean.failure(404,"图片不存在").toString());
        }else{
            try {
                // 调用ImageService方法从Minio存储中提取图像
                imageService.fetchImageFromMinio(stream,imagePath);
                // 设置响应头，指示浏览器缓存图像
                response.setHeader("Cache-Control","max-age-2592000");
            }catch (ErrorResponseException e){
                // 处理从Minio存储提取图像时发生的错误
                if(e.response().code()==404) {
                    // 如果Minio存储返回404错误，表明图像不存在，向客户端返回404错误
                    response.setStatus(404);
                    stream.println(RestBean.failure(404, "图片不存在").toString());
                }else {
                    // 如果发生其他错误，记录错误日志
                    log.error("从Minio获取图片异常"+e.getMessage(),e);
                }
            }
        }
    }
}
